package logicaDelNegocio;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

import excepciones.LlamadaASiMismoException;
import excepciones.NoExisteTerminalException;
import excepciones.terminalOcupadoException;

public abstract class Terminal extends Thread {
	
	String estadoActual;
	List<Estado> estados;
	Queue<LLamada> llamadas;
	Semaphore semaforo;
	
	
	String idTerminal;
	String idConmutadorPadre;
	String numeroTerminal;
	Llamador llamador;
	private List<Integer> esperas;
	
	
	public  Terminal(String idTerminal, String idConmutadorPadre, String numeroTerminal) {
		this.idTerminal = idTerminal;
		this.idConmutadorPadre = idConmutadorPadre; 
		this.numeroTerminal = numeroTerminal;
		this.esperas = new ArrayList<Integer>();   
		this.semaforo=new Semaphore(1,true);	//El primer parametro representa el numero de hilos que pueden acceder
												//simultaneamente al recurso. El segundo, habilita la cola de espera
												//en orden de llegada.
		this.estadoActual="Libre";
		 
	}
//	public Terminal (String numeroTerminal){
//		this.numeroTerminal=numeroTerminal;
//	}
	public Terminal(String idTerminal){
		this.idTerminal= idTerminal; 
	}

	public List<Integer> getEsperas() {
		return esperas;
	}
	public void setLlamador(Llamador llamador){
		this.llamador=llamador;
	}

	public void setEsperas(List<Integer> esperas) {
		this.esperas = esperas;
	}

	public String getEstadoActual() {
		return estadoActual;
	}

	public void setEstadoActual(String estadoActual) {
		this.estadoActual = estadoActual;
	}

	public List<Estado> getEstados() {
		return estados;
	}

	public void setEstados(List<Estado> estados) {
		this.estados = estados;
	}

	public Queue<LLamada> getLlamadas() {
		return llamadas;
	}

	public void setLlamadas(Queue<LLamada> llamadas) {
		this.llamadas = llamadas;
	}

	public String getIdTerminal() {
		return idTerminal;
	}

	public void setIdTerminal(String idTerminal) {
		this.idTerminal = idTerminal;
	}

	public String getIdConmutadorPadre() {
		return idConmutadorPadre;
	}

	public void setIdConmutadorPadre(String idConmutadorPadre) {
		this.idConmutadorPadre = idConmutadorPadre;
	}

	public String getNumeroTerminal() {
		return numeroTerminal;
	}

	public void setNumeroTerminal(String numeroTerminal) {
		this.numeroTerminal = numeroTerminal;
	}

	
	public int getColaDeLlamados(){
		
		return this.semaforo.getQueueLength();
	}
	
	public void run(){
		
		try {
			this.llamador.realizarLlamadas(this.idTerminal);
		} catch (LlamadaASiMismoException e) {
		
			e.printStackTrace();
		}
		
	
	}
	public boolean isExterno(){
		return false;
	}
	
	public boolean isInterno(){
		return false;
	}
	public void incrementarLlamadasInternasRecibidas(){
		return;
	}
	public void incrementarLlamadasExternasRecibidas(){
		return;
	}
	public void incrementarLlamadasInternasEfectuadas(){
		return;
	}
	public void incrementarLlamadasExternasEfectuadas(){
		return;
	}
	public void incrementarLlamadasRechazadas(){
		return;
	}
	public void incrementarLlamadasSinConectividad(){
		return;
	}
	public void incrementarTiempoTotalLlamadasRealizadas(int tiempo){
		return;
	}
	public void borrarDatosSimulacion() {
	
		
	}
	
	
	
}
